package lintulaskenta.entity;



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

/*
 * Pistevuosi on Havainnointipisteen vuosittainen laskenta.
 * Jos reittiä on laskettu kahtena vuotena, on havainnointipisteitä
 * reitillä 20, mutta pistevuosia 40, eli yksi kokoelma per vuosi.
 */

@Entity
public class Pistevuosi implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long pistevuosiId; 
    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn
    private Havaintopiste havaintopiste;
    @ManyToOne
    @JoinColumn
    private Havainnointitapahtuma havainnointitapahtuma;
    @Column
    private int pisteenJarjestysnumero; 
    @Column
    private int biotooppikoodiNyt;   
    @Column
    private int biotooppikoodiEnnen;    
    @Column
    private int reitinNumero;   
    @Column
    private int vuosi;
    @Column
    private String lisatietoaPisteesta;
    @Column
    private int reitinSade;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy="pistevuosi")
    private List<Parvihavainto> parvihavainnot = new ArrayList<Parvihavainto>();
    @OneToMany(cascade = CascadeType.MERGE, mappedBy="pistevuosi")
    private List<Lajihavainto> lajihavainnot = new ArrayList<Lajihavainto>();

    
    public Pistevuosi() {
    }

    public Pistevuosi(Havaintopiste havaintopiste, int pisteenJarjestysnumero, int biotooppikoodiNyt, int biotooppikoodiEnnen, int reitinNumero, int vuosi, int reitinSade) {
        this.havaintopiste = havaintopiste;
        this.pisteenJarjestysnumero = pisteenJarjestysnumero;
        this.biotooppikoodiNyt = biotooppikoodiNyt;
        this.biotooppikoodiEnnen = biotooppikoodiEnnen;
        this.reitinNumero = reitinNumero;
        this.vuosi = vuosi;
        this.reitinSade = reitinSade;
    }

    public Havainnointitapahtuma getHavainnointitapahtuma() {
        return havainnointitapahtuma;
    }

    public void setHavainnointitapahtuma(Havainnointitapahtuma havainnointitapahtuma) {
        this.havainnointitapahtuma = havainnointitapahtuma;
    }

    public int getBiotooppikoodiEnnen() {
        return biotooppikoodiEnnen;
    }

    public void setBiotooppikoodiEnnen(int biotooppikoodiEnnen) {
        this.biotooppikoodiEnnen = biotooppikoodiEnnen;
    }

    public String getLisatietoaPisteesta() {
        return lisatietoaPisteesta;
    }

    public void setLisatietoaPisteesta(String lisatietoaPisteesta) {
        this.lisatietoaPisteesta = lisatietoaPisteesta;
    }

    public void katenoiLisatietoaPisteestaKenttaan(String lisatietoaPisteesta) {
        this.lisatietoaPisteesta += " "+lisatietoaPisteesta;
    }

    public int getBiotooppikoodiNyt() {
        return biotooppikoodiNyt;
    }

    public void setBiotooppikoodiNyt(int biotooppikoodiNyt) {
        this.biotooppikoodiNyt = biotooppikoodiNyt;
    }

    public Havaintopiste getHavaintopiste() {
        return havaintopiste;
    }

    public void setHavaintopiste(Havaintopiste h) {
        if (h != null) {
          this.havaintopiste = h;  
        }
    }

    public List<Lajihavainto> getLajihavainnot() {
        return lajihavainnot;
    } 
    
    public void addLajihavainto(Lajihavainto lh) {
        lh.setPistevuosi(this);
        if (!lajihavainnot.contains(lh)) {
            lajihavainnot.add(lh);
        }
    }
    
    public int getPisteenJarjestysnumero() {
        return pisteenJarjestysnumero;
    }

    public void setPisteenJarjestysnumero(int pisteenJarjestysnumero) {
        this.pisteenJarjestysnumero = pisteenJarjestysnumero;
    }

    public long getPistevuosiId() {
        return pistevuosiId;
    }

    public int getReitinNumero() {
        return reitinNumero;
    }

    public void setReitinNumero(int reitinNumero) {
        this.reitinNumero = reitinNumero;
    }

    public List<Parvihavainto> getParvihavainnot() {
        return parvihavainnot;
    }

    public void addParvihavainto(Parvihavainto ph) {
        ph.setPistevuosi(this);
        if (!parvihavainnot.contains(ph)) {
            parvihavainnot.add(ph);
        }
    }
      
    public int getReitinSade() {
        return reitinSade;
    }

    public void setReitinSade(int reitinSade) {
        this.reitinSade = reitinSade;
    }

    public int getVuosi() {
        return vuosi;
    }

    public void setVuosi(int vuosi) {
        this.vuosi = vuosi;
    }
    
    public int getParvihavaintojenLkm() {
        return parvihavainnot.size();
    }
    
    public int getLajihavaintojenLkm() {
        return lajihavainnot.size();
    }
}
